插件编写介绍 您所在的位置:网站首页 lua xml ui 插件编写介绍

插件编写介绍

2023-06-19 03:19| 来源: 网络整理| 查看: 265

Icon goldbox.png INV Enchanting 70 Pet Pen.png

需要校对 这篇文章刚刚完成,还需要进一步校对和完善。请注意移除汉字的斜体效果。你可以在这里找到其他需要校对的词条。

Icon goldbox.png Ability Paladin HandofLight.png

需要帮助这篇文章需要改进。

AddOn programming introduction

这篇文章介绍了如何编写一个最基础的插件。和大多数编程语言教程一样,这篇文章会教你编写一个“Hello, world!”插件。

注意:插件编写是一项进阶任务。你需要能够使用电脑,包括:

知道你使用的是何种操作系统(如“Windows”或“Mac OS X”)。 知道如何打开电脑上的文件夹(如使用Windows上的文件资源管理器,或者MacOSX上的Finder)。 知道电脑上文本编辑器的大致使用方式,以及如何保存文本文件至特定文件夹。 知道什么是文件和文件夹(又叫“路径”)。 知道形如C:\Program Files\World of Warcraft\Patch.html表达的意义(文件或文件夹的位置) 目录 1 准备 1.1 文本编辑器 1.2 找到AddOns文件夹 2 创建新插件 2.1 .toc(目录) 2.2 .lua(Lua代码) 2.2.1 事件 2.2.2 函数 2.2.3 HelloWorld.lua 2.3 .xml 2.3.1 暴雪XML格式声明 2.3.2 XML标签 2.3.3 HelloWorld.xml 2.4 运行HelloWorld插件 准备

要编写插件,首先要在电脑上安装好以下2个软件:

魔兽世界 任意一种文本编辑器 文本编辑器

文本编辑器的作用是用来编辑纯文本(以此得名)。需要区分一下“文本编辑器”和“文字处理器”——文字处理器可以给文字加上各种格式(如粗体或斜体),因此这类软件不保存纯文本文件,而是保存文档文件。在Windows系统上,“记事本”就是一个(非常有限的)文本编辑器,而“写字板”或是微软的“Word”就是文字处理器。这里可以使用“记事本”,而不能使用“写字板”或是“Word”。

有很多种免费的文本编辑器可供选择,带有语法高亮的功能的更好。这里推荐一下几种文本编辑器:

Windows:Notepad++(免费,强烈推荐) Mac:TextWrangler Linux:Kate默认使用KDE,而Gnome默认使用gedit,它们都有Lua语法高亮功能。

注意:在Lua编辑器概述页面介绍了更多Lua编辑器,但是大多数功能这篇教程中不需要用到,因此这里只推荐了最基础的编辑器。

找到AddOns文件夹

所有的插件都位于一个名为AddOns的特定文件夹中。此文件夹位于:

%WorldOfWarcraftFolder%\Interface\AddOns

其中%WorldOfWarcraftFolder%代表你的电脑中魔兽世界的安装位置。一般情况下,完整路径如下所示:

Windows: C:\Program Files\World of Warcraft\Interface\AddOns 或C:\Users\public\games\World of Warcraft\Interface\AddOns(自Windows Vista以来,用户没有管理员权限时会安装在此处) Mac: /Applications/World of Warcraft/Interface/AddOns 创建新插件

如上面所说,所有插件都存放在名为AddOns的特定文件夹中,每个插件在AddOns文件夹中都有自己的目录。

要创建新的插件,执行以下步骤:

为插件创建一个名为HelloWorld的目录 创建三个空文本文件,分别命名为HelloWorld.toc、HelloWorld.lua和HelloWorld.xml

请注意,这三个文件名唯一的区别就是后缀名。这几个后缀名分别表示:

.toc代表目录(Table of Content) .lua代表Lua代码文件 .xml代表XML user interface

重要提示:在AddOns中建立的文件夹名称和.toc文件的名称必须匹配。

重要提示2:如果您在魔兽世界运行时将新文件(如.lua或.XML文件)添加到插件中,则需要重新启动魔兽世界,仅仅重新加载界面是不够的。但是,更改现有文件只需要重新加载界面。

接下来的步骤是使用文本编辑器编写这三个文本文件的内容。每个文件的内容将在下面几节中介绍。

.toc(目录)

这个文件将关于你的插件的信息告诉魔兽世界客户端:要加载哪些文件,以及加载它们的顺序。你可以在稍后查看TOC格式页面,了解此文件内容的所有细节信息。现在我们只是使用一些基本的东西。

使用文本编辑器,将以下内容写进HelloWorld.toc:

## Interface: 70300 ## Title: Hello World! ## Notes: My first AddOn ## Version: 1.0.0 HelloWorld.lua HelloWorld.xml

这些内容很好理解:

以##开头的几行称为“.toc标签”,提供关于插件的基本信息。 不以##开头的两行告诉魔兽世界客户端那些文件属于此插件(这里是HelloWorld.lua和HelloWorld.xml)。 以单个#(上面的例子里没有)被认为是注释,会被魔兽世界忽略。

因此这段代码逐行的意思是:

这个插件兼容的界面版本是70300 在游戏中显示的插件标题为“Hello World!” 在游戏中要显示的插件描述 插件的当前版本 HelloWorld.lua文件将被加载 HelloWorld.xml文件将被加载

关于第一行,有一些注意事项:

## Interface: 70300

当您尝试按照本教程进行操作时,该值可能会发生变化,您需要输入当前值。如果正在运行魔兽世界,可以通过运行下面的命令找到这个数字:

/run print((select(4,GetBuildInfo())))

如果不方便运行魔兽世界,可以查看已安装的其它插件的.toc文件,或者查看获取当前接口编号。

这个数字代表的是插件的用户界面版本。例如,“70300”对应魔兽世界的7.3.x版本(其中x是任意数字)。这个数字确定了该插件与哪个版本的魔兽世界兼容,如果它与暴雪的用户界面编号不匹配,这个插件将被视为过期,除非用户在登录前勾选“加载过期插件”,否则此插件就不会加载。

想知道此文件中内容的更多细节,请访问TOC格式页面。

.lua(Lua代码)

这个文件是确定插件“做什么”的主要文件。Lua代码对游戏中发生的事情作出回应。游戏中发生的事情叫做“事件”。

事件

有两种基本类型的事件。

第一种事件是游戏中发生的事情。如某人在说些什么,发生在你的角色身上的事情,或是另一个角色的数据变化等等。几乎所有在游戏中发生的事情都会导致时间发生。 第二种事件是当你对界面元素(如按钮等)做了某些事请。比如说点击背包或是其它的某个按钮。

这两种事件之间存在技术上的差异,随着教程的进展我们将讨论此问题。关于第一种事件的更多详细信息,请参阅事件(API),第二种请参阅Widget handlers。

重要提示:如果你不小心写了一段要运行很长时间(甚至永远持续下去)的代码,游戏将不会任何事情。游戏将会卡死,没有任何东西会移动,用户将无法再点击任何东西。这样显然属于“不好的”。

那么,如何告诉魔兽世界你对某个特定事件感兴趣?有两种方法:首先,您可以告诉魔兽世界在发生特定事件时要运行哪段代码。这被称为注册事件。其次,您可以告诉XML在界面元素被操纵时(例如点击它或将鼠标移动到其上)运行一段代码。这些响应事件运行的代码被称为“函数”(或更精确的“事件处理程序”)。

函数

函数是完成特定目的的代码分组。一方面,魔兽世界提供了许多预定义的功能,称为“API函数”(API即Application Programming Interface,应用程序编程接口)。另一方面,您也可以创建自己的用户定义函数。

虽然Lua语言中创建函数有多种方法,但最容易理解的是这样的:

[local] function 函数名() -- 函数内容 end [local]是一个可选的关键字,限制了函数生效的范围。关于范围将在稍后深入讨论。 函数名是你自己决定的一个名字,用来在插件的其它地方使用此函数。 是向函数传递信息的方式。这就是函数如何实现功能的。每次调用函数时,都可以提供一组不同的参数,并根据它们获取不同的结果。 函数内容即函数实现功能的内容。计算、比较、调用其它函数等等都被包含在此处。 end关键字表示了函数定义的结束。

请注意,这只是定义了函数。这个函数实际上并没有运行,直到其它一段代码调用它。

有关函数的更多信息,请参阅Lua 5.1参考手册或Lua编程(第一版)。另请参阅列出更多Lua资源的Lua页面。

HelloWorld.lua

现在继续“Hello, World”代码势力。在HelloWorld.lua中写上如下代码:

function HelloWorld (self) print("Hello World!"); end

到目前为止你应该能看懂这些代码。这个函数名为HelloWorld,有零个参数。代码部分就是print("Hello World!");。然后代码以end结尾。

这一段代码写好了,但它本身并没有用,除非有人调用这个函数。接下来是界面元素。

.xml

“界面元素”(UI Elements),或者叫“小部件”(Widgets),指的是组成用户界面的所有图形的各个小部分。魔兽世界使用XML来布置您在屏幕上看到的所有内容。另外,当事件发生在屏幕上的小部件时,可以调用事件处理程序(即函数)来执行想要的操作。我们很快就可以看到应该如何告诉魔兽世界我们感兴趣的小部件,以及我们想要通过哪个事件处理程序来处理哪些事件。

暴雪XML格式声明

为不知道的人介绍一下:XML代表eXtensible Markup Language,即“可扩展标记语言”,意为用标签来标记内容。存在什么样的标签,以及标签如何组织,可以被定义在一个称为“XML Schema”的东西中。在我们的例子中,我们希望创建的是魔兽世界能够理解的XML文档,因此我们要使用暴雪为魔兽世界用户界面提供的XML Schema。

用这些代码来声明我们的文档使用暴雪的格式:

这些内容的确切含义超出了本教程的范围,对于大多数插件开发者来说,只要将其放入为魔兽世界用户界面创建的每一个.xml文件中。

暴雪将小部件定义在.xsd文件中,如果你解压了客户端文件,你可以在Interface/FrameXML/UI.xsd目录下找到此文件。

XML标签

处理XML文件,尤其是用于魔兽世界的XML文件时,有一些大致的东西需要了解。一个“标签”的大致格式是:

每个标签必须有一个标签名,和零个或更多属性,属性对应的取值写在双引号之间。标签指的是从之间的所有内容。标签用对应结束标签来关闭('')。标签名不能含有空格,并且大小写敏感。如“BackgroundWidgets”是一个有效的标签名,而“backgroundwidgets”是无效的。

标签和结束标签之间的所有东西是标签的“内容”,包括嵌套标签中的其它标签以及它们的内容。有一种特殊情况:如果标签没有任何内容,则可以用来简写表示,例如:

以之前插入的那段代码举例说明:代码中包含了一个名为“Ui”的标签,它有三个属性。内容将被写在第一个>和结束标签之间。

HelloWorld.xml

现在继续“Hello, World"的XML示例。先将之前的代码写进HelloWorld.xml:

在为插件创建框架之前,我们还需要添加简单的一行,告诉魔兽世界如何在Lua文件中找到函数。这个标签就是一个没有内容的标签(如上文所说),因此只要以/>结尾,而不需要结束标签。

魔兽世界将所有东西联系在框架上,框架层层嵌套。所以,要创建一个与魔兽世界互动的内容,就要先创建一个框架:

这个标签名为“Frame”,有一个名为“name”的属性,属性值为“HelloWorldFrame”。

这个Frame标签应该加在Ui标签的内容中。目前为止,文件中的代码如下:

不要将各种结束标签混在一起,并且缩进代码、对齐每个标签和对应的结束标签,这有利于使代码更加清晰。“Frame”标签和“Script”标签应该完全包含在“Ui”标签中间。

框架中我们可以定义的内容之一就是脚本——一段Lua代码。将脚本放在哪里决定它何时被调用。由于脚本包含在框架中,所以我们要在“Frame”标签中加入“Scipts”标签。注意与之前的“Script”标签区分——这一次的标签名多了个“s”。

各种小部件都可以发生很多种事件,想要在某种事件触发时作出动作,就要在“Scripts”标签中包含事件名。在这个例子中,我们要用到的是一个名为“OnLoad”的事件,该事件发生在小部件在界面中加载时。例如,我们要在OnLoad事件发生时运行名为HelloWorld的脚本(HelloWorld.lua)中定义的函数。

HelloWorld(self);

完整的HelloWorld.xml文件如下:

HelloWorld(self);

上面的代码中,函数HelloWorld是除了标签和属性之外唯一的内容。魔兽世界的.xml文件中往往除了标签和属性只有很小一部分代码,这些代码只能写在表示事件的标签中间。

现在可以运行这个新插件了。

运行HelloWorld插件

现在在你的AddOns文件夹中应该有了一个HelloWorld文件夹,HelloWorld文件夹中有HelloWorld.toc、HelloWorld.lua和HelloWorld.xml三个文件,它们的内容都在上文中给出了。

现在运行魔兽世界,登陆你的账号,不过先不要选择角色。点击角色选择界面左下角红色的“插件”按钮,可以看到魔兽世界检测到的所有插件。“AddOns”文件夹中,除了以“Blizzard_”开头的文件夹都会在此显示。

你应该可以在这个列表中找到黄色名字的“HelloWorld”插件,并且此插件是被勾选的状态。如果插件名字是红色,你可能是没有更改HelloWorld.toc文件第一行中的数字,使之与客户端版本匹配。如果你没在列表里找到你的新插件,去确认一下文件路径的位置。

给Windows用户的额外提示:确认你没有将文件保存为HelloWorld.toc.txt等,因为Windows有“隐藏文件扩展名”的选项。

插件的名字默认为黄色显示。插件的名字由HelloWorld.toc中的## Title: HelloWorld!一行决定。通过.toc文件还可以改变显示的颜色、语言等。当把鼠标移到插件名字上时,会弹出一个鼠标提示,显示由## Notes: My first AddOn一行提供的备注信息,这同样可以改变颜色和语言。

关闭插件窗口,随便进入一个角色。你会看到聊天框中出现一条信息:“Hello World!”,即代表插件运行成功。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有